﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using InnvoiceActual.Logica.GestorObject.Articulo;
using InnvoiceActual.Logica.GestorObject.Factura;
using System.Windows;

namespace InnvoiceActual.Logica.GestorDB
{
    public sealed class UnicodigoArticuloDB
    {
        private static UnicodigoArticuloDB _instance;
        public delegate void EnviarUnicodigoArticulo(UnicodigoArticulo sender);
        public EnviarUnicodigoArticulo enviarUnicodigo;
        List<UnicodigoArticulo> _lista = new List<UnicodigoArticulo>();

        //constructor
        public UnicodigoArticuloDB()
        {
            //setea la lista con los codigos al instanciarla.
            CargarCodigos();
        }

        public static UnicodigoArticuloDB Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new UnicodigoArticuloDB();
                }
                return _instance;
            }
        }

        //Aca tendria de acceder a la BD que ahora no lo hago para agilizar de momento.
        private void CargarCodigos() 
        {
            //aca deberia utilizar los datos de la tabla en la BD.
            ArticuloDB _articuloDB = new ArticuloDB();
            List<Articulo> _art = new List<Articulo>();
            List<SubArticulo> _sub = new List<SubArticulo>();

            _art = _articuloDB.ObtenerArticulosSegunEstado(1);
            _sub = _articuloDB.ObtenerSubArticulosSegunEstado(1);

            foreach (SubArticulo auxSub in _sub)
            {
                    Articulo result = _art.Find(
                    delegate(Articulo bk)
                    {
                        return bk.Codigo == auxSub.CodigoArticulo;
                    }
                    );
                    if (result != null)
                    {
                        UnicodigoArticulo _unicodigo = new UnicodigoArticulo();
                        _unicodigo.Categoria = result.CodigoCategoriaArticulo;
                        _unicodigo.Articulo = result.Codigo;
                        _unicodigo.SubArticulo = auxSub.Codigo;

                        //Console.WriteLine("codigo :: " + _unicodigo.Categoria + " - " + _unicodigo.Articulo + " - " + _unicodigo.SubArticulo + " - " + auxSub.Descripcion);

                        _unicodigo.Descripcion = auxSub.Descripcion;
                        _unicodigo.Codigo_Alicuota = auxSub.Codigo_Alicuota;
                        _unicodigo.Tasa = auxSub.Codigo_Alicuota_Tasa;
                        _unicodigo.PrecioNeto = auxSub.PrecioNeto;
                        _lista.Add(_unicodigo);
                    }
            }
        }

        //filtra el codigo
        public void filtroUnicodigo (ItemsFactura auxUnicodigo)
        {             
            UnicodigoArticulo result = _lista.Find(
                delegate(UnicodigoArticulo bk)
                {
                    return (bk.Categoria == auxUnicodigo.Codigo_Categoria_Art &&
                           bk.Articulo == auxUnicodigo.Codigo_Articulo &&
                           bk.SubArticulo == auxUnicodigo.Codigo_subArticulo);
                }
               );
            if (result != null)
                enviarUnicodigo(result);
            else
                enviarUnicodigo(new UnicodigoArticulo());
        }

        //metodo que permite reargar la lista de Articulos si este se modifica por el agregado de un nuevo SubArticulo
        public void recargarUnicodigo()
        {
            _lista.Clear();
            CargarCodigos();
        }


    }
}
